package algorithm.swordoff;


/**
 * 剪绳子
 * 与主站 343题相同
 *
 * 给你一根长度为 n 的绳子，请把绳子剪成整数长度的 m 段（m、n都是整数，n>1并且m>1），每段绳子的长度记为 k[0],k[1]...k[m-1] 。
 * 请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少？
 * 例如，当绳子的长度是8时，我们把它剪成长度分别为2、3、3的三段，此时得到的最大乘积是18。
 *
 */

public class SQ14 {
    public int cuttingRope(int n) {
        int[] dp = new int[Math.max(n+1, 4)];
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 1;
        dp[3] = 2;

        for (int i = 4; i < n+1; i++) {
            int tempMax = 0;
            for (int j = 1; j < i-1; j++) {
                int cutTwoSide = dp[j]*dp[i-j]; // 两边都剪
                int cutOneSide = j*dp[i-j]; // 只剪一边
                int cutNoSide = j*(i-j);  // 两边都不再继续剪开
                int curMax = Math.max(cutNoSide, Math.max(cutOneSide, cutTwoSide));
                tempMax = Math.max(tempMax, curMax);
            }
            dp[i] = tempMax;
        }
        return dp[n];
    }

    public static void main(String[] args) {
        SQ14 sof = new SQ14();
        System.out.println(sof.cuttingRope(33));

    }
}
